SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
CREATE PROCEDURE [paChequearReestructura]

@IdReestructura INT,
@Accion INT

--Acciones definidas
--1.- Chequeo que pone OK o Con Errores
--2.- Aprobado EDU, solo aprueba si es OK
--3.- Cerrado, no se puede editar mas

AS

DECLARE @EstadoReestructura INT
SELECT @EstadoReestructura = (SELECT Estado FROM tb_Reestructuras WHERE IdReestructura = @IdReestructura)

-- Si la Reestructura no esta aprobado o vigente o cerrarda ...
IF @EstadoReestructura NOT IN(15, 16, 18) BEGIN

	-- Si no es CERRADO, se hace el chequeo para el cambio de estado
	IF @Accion <> 3 BEGIN

		DECLARE @AnioReestructura INT
		SELECT @AnioReestructura = YEAR(FechaVigencia) FROM tb_Reestructuras WHERE IdReestructura = @IdReestructura

		DECLARE @IdLimitePresupuestario INT
		DECLARE @Medida INT
		DECLARE @Partida INT
		DECLARE @SaldoLimite INT
		DECLARE @Estado BIT
		SET @Estado = 1 -- BIEN

		DECLARE X CURSOR FOR 
			SELECT IdLimitePresupuestario, UnidadDeMedida, PartidaGenerica, Limite FROM tb_LimitesPresupuestarios L WHERE Ejercicio = @AnioReestructura

		OPEN X

		FETCH NEXT FROM X INTO @IdLimitePresupuestario, @Medida, @Partida, @SaldoLimite

		PRINT('REESTRUCTURA: ' + CAST(@IdReestructura AS VARCHAR))
		PRINT('EJERCICIO: ' + CAST(@AnioReestructura AS VARCHAR))
		PRINT('')

		WHILE @@FETCH_STATUS = 0 BEGIN

			DECLARE @SaldoTemp INT
			SET @SaldoTemp = 0
	
			--Reestrcutura EDITADA
			SELECT @SaldoTemp = @SaldoTemp + Saldo FROM tb_SaldosDeReestructura WHERE Reestructura = @IdReestructura AND Limite = @IdLimitePresupuestario
	
			IF @SaldoTemp <= @SaldoLimite BEGIN
				PRINT('LIMITE ' + CAST(@IdLimitePresupuestario AS VARCHAR) + ' OK')
				PRINT('  -> SALDO: ' + CAST(@SaldoTemp AS VARCHAR) + ' / LIMITE: ' + CAST(@SaldoLimite AS VARCHAR))
			END
			ELSE BEGIN
				SET @Estado = 0
				PRINT('LIMITE ' + CAST(@IdLimitePresupuestario AS VARCHAR) + ' NOK')
				PRINT('  -> SALDO: ' + CAST(@SaldoTemp AS VARCHAR) + ' / LIMITE: ' + CAST(@SaldoLimite AS VARCHAR))
			END

			FETCH NEXT FROM X INTO @IdLimitePresupuestario, @Medida, @Partida, @SaldoLimite

		END 

		CLOSE X
		DEALLOCATE X

		PRINT('')
		PRINT('ESTADO FINAL: ' + CAST(@Estado AS VARCHAR))

		IF @Accion = 1 BEGIN
			IF @Estado = 1 
				UPDATE tb_Reestructuras SET Estado = 14 WHERE IdReestructura = @IdReestructura
			ELSE
				UPDATE tb_Reestructuras SET Estado = 13 WHERE IdReestructura = @IdReestructura

			DECLARE @IdReestructuraAnt INT
			SELECT @IdReestructuraAnt = IdReestructura FROM tb_Reestructuras WHERE FechaVigencia = (SELECT MAX(FechaVigencia) FROM tb_Reestructuras WHERE Estado IN(16, 18))

			SELECT L.Descripcion DLimite, L.Limite, U.Descripcion DUnidadDeMedida, S.Saldo SaldoPost, 
			ISNULL((SELECT Saldo FROM tb_SaldosDeReestructura S1 INNER JOIN tb_Reestructuras R1 ON R1.IdReestructura = S1.Reestructura INNER JOIN tb_LimitesPresupuestarios L1 ON L1.IdLimitePresupuestario = S1.Limite WHERE S1.Reestructura = @IdReestructuraAnt AND YEAR(R1.FechaVigencia) = L1.Ejercicio AND L1.PartidaGenerica = L.PartidaGenerica AND L1.UnidadDeMedida = L.UnidadDeMedida AND (L1.Cargo = L.Cargo OR L1.Cargo IS NULL)),0) SaldoPre, 
			(S.Saldo - ISNULL((SELECT Saldo FROM tb_SaldosDeReestructura S1 INNER JOIN tb_Reestructuras R1 ON R1.IdReestructura = S1.Reestructura INNER JOIN tb_LimitesPresupuestarios L1 ON L1.IdLimitePresupuestario = S1.Limite WHERE S1.Reestructura = @IdReestructuraAnt AND YEAR(R1.FechaVigencia) = L1.Ejercicio AND L1.PartidaGenerica = L.PartidaGenerica AND L1.UnidadDeMedida = L.UnidadDeMedida AND (L1.Cargo = L.Cargo OR L1.Cargo IS NULL)),0)) Diferencia,
			CASE 
			WHEN S.Saldo <= L.Limite THEN 1
			ELSE 0
			END OK
			FROM tb_LimitesPresupuestarios L 
			INNER JOIN tb_SaldosDeReestructura S ON S.Limite = L.IdLimitePresupuestario
			INNER JOIN tb_Reestructuras R ON R.IdReestructura = S.Reestructura
			INNER JOIN tb_UnidadesDeMedidaDeLimitesPresupuestarios U ON U.IdUnidadDeMedida = L.UnidadDeMedida
			WHERE S.Reestructura = @IdReestructura AND YEAR(R.FechaVigencia) = L.Ejercicio
			ORDER BY L.IdLimitePresupuestario
		END
		IF @Accion = 2 BEGIN
			IF @Estado = 1 
				UPDATE tb_Reestructuras SET Estado = 16 WHERE IdReestructura = @IdReestructura
		END
		IF @Accion = 4 
			UPDATE tb_Reestructuras SET Estado = 17 WHERE IdReestructura = @IdReestructura --Autoriza directamente en ECO.
				
	END
	ELSE BEGIN
		UPDATE tb_Reestructuras SET Estado = 15 WHERE IdReestructura = @IdReestructura
	END
END


GO
GRANT EXECUTE ON  [dbo].[paChequearReestructura] TO [CentroDeDesignaciones]
GRANT EXECUTE ON  [dbo].[paChequearReestructura] TO [Reestructura]
GO
